package org.lib.jpamysql.mtm;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.lib.jpamysql.mtm.dao.MtmBlogDAO;
import org.lib.jpamysql.mtm.dao.MtmBlogTagDAO;
import org.lib.jpamysql.mtm.dto.AddMtmBlogDTO;
import org.lib.jpamysql.mtm.vo.FullTagVO;
import org.lib.jpamysql.mtm.vo.MtmBlogVO;
import org.lib.jpamysql.mtm.vo.SimpleBlogVO;
import org.lib.jpamysql.mtm.vo.TagVO;
import org.springframework.beans.BeanUtils;
//import org.lib.jpamysql.mtm.dao.MtmBlogTagRelDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import lombok.extern.slf4j.Slf4j;

@RestController
@RequestMapping(value="/mtmBlog")
@Slf4j
public class MtmBlogController {

	@Autowired
	private MtmBlogDAO blogDao;
	
	@Autowired
	private MtmBlogTagDAO tagDao;
	
//	@Autowired
//	private MtmBlogTagRelDAO relDao;
	
	@PostMapping("/add")
	public Long add(@RequestBody AddMtmBlogDTO dto) {
		MtmBlog blog = new MtmBlog();
		blog.setTitle(dto.getTitle());
		blog.setContent(dto.getContent());
		
		List<MtmBlogTag> blogTags = new ArrayList<MtmBlogTag>();
		blog.setTags(blogTags);
		
		// 先添加tag
		Set<String> tags = dto.getTags();
		if (!CollectionUtils.isEmpty(tags)) {
			// 非空，添加tags
			Set<MtmBlogTag> newTags = new HashSet<MtmBlogTag>();
			tags.forEach(tag -> {
				// 检查tag是否存在，已存在，不做添加
				tag = tag.trim();
				MtmBlogTag oldTag = tagDao.findByTag(tag);
				if (oldTag != null) {
//					newTags.add(oldTag);
					blogTags.add(oldTag);
				} else {
					// 添加
					oldTag = new MtmBlogTag();
					oldTag.setTag(tag);
					// 稍后一起添加
					newTags.add(oldTag);
				}
			});
			
			log.info("新增前：newTags.size={}", newTags.size());
			log.info("新增前：blogTags.size={}", blogTags.size());
			if (!newTags.isEmpty()) {
				// 添加新标签
				tagDao.saveAll(newTags);
				printNewTags(newTags);
				
				blogTags.addAll(newTags);
				log.info("新增后：blogTags.size={}", blogTags.size());
			}
		}
		
		blogDao.save(blog);
		log.info("新增blog：id={}", blog.getId());
		
		return blog.getId();
	}
	
	/**
	 * 调试
	 * @author ben
	 * @date 2021-10-20 10:56:26 CST
	 * @param newTags
	 */
	private void printNewTags(Collection<MtmBlogTag> newTags) {
		System.out.println("printNewTags:");
		newTags.forEach(tag->{
			System.out.println("tag=" + tag);
		});
	}
	
	@GetMapping(value="/get")
	public MtmBlogVO get(@RequestParam Long id) {
		if (!blogDao.existsById(id)) {
			return null;
		}
		
		// 返回值
		MtmBlogVO vo = new MtmBlogVO();
		List<TagVO> voTags = new ArrayList<>();
		vo.setTags(voTags);
		
		MtmBlog blog = blogDao.getById(id);
		BeanUtils.copyProperties(blog, vo);
		
		List<MtmBlogTag> tags = blog.getTags();
		if (!tags.isEmpty()) {
			tags.forEach(tag->{
				TagVO tvo = new TagVO();
				BeanUtils.copyProperties(tag, tvo);
				voTags.add(tvo);
			});
		}
		
		return vo;
	}
	
	@GetMapping(value = "/getTag")
	public FullTagVO getTag(@RequestParam Long id) {
		MtmBlogTag tag = tagDao.findById(id).orElse(null);
		
		if (tag == null) {
			return null;
		}
		
		FullTagVO vo = new FullTagVO();
		BeanUtils.copyProperties(tag, vo);
		List<SimpleBlogVO> voBlogs = new ArrayList<>();
		vo.setBlogs(voBlogs);
		
		List<MtmBlog> blogs = tag.getBlogs();
		if (!CollectionUtils.isEmpty(blogs)) {
			blogs.forEach(blog->{
				SimpleBlogVO sbvo = new SimpleBlogVO();
				sbvo.setId(blog.getId());
				sbvo.setTitle(blog.getTitle());
				voBlogs.add(sbvo);
			});
		}
		
		return vo;
	}
	
}
